package com.hua.controller;


import com.hua.pojo.Food;
import com.hua.pojo.User;
import com.hua.service.FoodService;
import com.hua.utils.HandleTokenUtils;
import com.hua.utils.JwtUtils;
import com.hua.utils.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author hua
 * @since 2023-12-24
 */
@Api(tags = "菜品管理")
@Slf4j
@RestController
@RequestMapping("/food")
public class FoodController {

    @Autowired
    private FoodService foodService;
    @Autowired//处理jwt是否有效
    private HandleTokenUtils handleTokenUtils;
    @Autowired//解析jwt
    private JwtUtils jwtUtils;


    /**
     * 此接口是获取菜品展示列表
     * @param requestData
     * @return
     */
    @ApiOperation("获取首页显示菜单API")
    @PostMapping("/getFoodList")
    public Result getFoodList(@RequestBody  Map<String, Object> requestData){

        int pageNo = (int) requestData.get("pageNo");
        int pageSize = (int) requestData.get("pageSize");
        int canteenId = (int) requestData.get("canteenId");
        int foodClassId = (int) requestData.get("foodClassId");
        log.info("pageNo:"+pageNo);
        log.info("pageSize:"+pageSize);
        log.info("canteenId:"+canteenId);
        log.info("foodClassId:"+foodClassId);


        //根据条件获取所有的
         Map<String, Object> footMap = foodService.getFoodList(pageNo,pageSize,canteenId,foodClassId);
        return Result.success(footMap,"获取成功！");
    }

    /**
     * 此接口是MySQL 中使用 ORDER BY RAND() 来实现随机排序，但是在数据量较大时可能会有性能问题，可以根据实际情况选择更合适的方法。
     * @return
     */
    @ApiOperation("随机菜单简易版API")
    @PostMapping("/getRandomFoodByTags")
    public Result getRandomFood(@RequestBody  Map<String, Object> requestData){

        String tags=(String) requestData.get("tags");//通过标签分类再随机
//        int id = (int) requestData.get("id");
//        String token=(String) requestData.get("token");
//        log.info("id:"+id);
//        log.info("token:"+token);

        /**
         * 处理token
         */
//        //判断jwt是否还有效
//        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
//        if(!b){//登录失效
//            return Result.loginFailure();
//        }

        //无标签随机
        if(tags.isEmpty()){
            Map<String, Object> footMap = foodService.getRandomFood();
            return Result.success(footMap,"获取随机菜单成功！");
        }
        Map<String, Object> footMap = foodService.getRandomFoodWithTabs(tags);
        if(footMap==null){//该标签下无结果
            return Result.fail("没有该标签的菜品！");
        }
        return Result.success(footMap,"获取随机菜单成功！");
    }


    /**
     * 此接口返回所有的菜品标签，以供随机菜单选择
     * @return
     */
    @ApiOperation("此接口返回所有的菜品标签，以供随机菜单选择")
    @GetMapping("/getAllTags")
    public Result getAllTags(){

        // 第一步，从数据库选择所有的数据tags列内容
        List<String> allTags = foodService.getAllTags();

        //第二步，拆分
        List<String> tags = this.processTags(allTags);
        // 第二步，去重
        Set<String> uniqueTagsSet = new HashSet<>(tags);

        // 将Set转换回List
        List<String> uniqueTagsList = new ArrayList<>(uniqueTagsSet);

        return Result.success(uniqueTagsList,"所有标签~");

    }
    public List<String> processTags(List<String> allTags) {
        List<String> processedTags = new ArrayList<>();

        // 第二步，对每一个标签进行处理
        for (String tags : allTags) {
            // 使用"/"分割tags
            String[] tagsArray = tags.split("/");

            // 将分割后的tags加入列表
            for (String tag : tagsArray) {
                // 使用 trim 去除可能的空格
                processedTags.add(tag.trim());
            }
        }

        return processedTags;
    }



    /**
     * 根据菜品id获取菜品信息
     * @param requestData
     * @return
     */
    @ApiOperation("菜品详情页-菜品介绍API")
    @PostMapping("/getFoodInfoById")
    public Result getFoodInfoById(@RequestBody  Map<String, Object> requestData){

        int id = (int) requestData.get("id");
        //String token=(String) requestData.get("token");
        log.info("id:"+id);
        //log.info("token:"+token);


//        /**
//         * 处理token
//         */
//        //判断jwt是否还有效
//        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
//        if(!b){//登录失效
//            return Result.loginFailure();
//        }

        //登录有效
        Map<String, Object> footMap = foodService.getFoodInfoById(id);
        return Result.success(footMap,"根据菜品id获取菜品详情成功！");
    }


    /**
     * 用户可以选择分类的标签，之后输入检索的信息进行检索
     */

    @ApiOperation("首页-菜品搜索API")
    @PostMapping("/searchFood")
    public Result searchFood(@RequestBody  Map<String, Object> requestData){

        int  category = (int) requestData.get("category");
        String data=(String) requestData.get("data");
        log.info("category:"+category);
        log.info("data:"+data);





        Map<String, Object> footMap = foodService.searchFood(category,data);

        if(footMap==null){
            return Result.fail("无搜索结果！");
        }else{
            return Result.success(footMap,"搜索成功！");
        }
    }

















    /**
     * 管理端——①菜品删除
     * @param requestData
     * @return
     */
    @ApiOperation("管理端——①根据菜品id删除菜品")
    @PostMapping("/deleteFoodByIds")
    public Result deleteFoodByIds(@RequestBody  Map<String, Object> requestData){

        String  ids = (String) requestData.get("data");
        String token = (String) requestData.get("token");
        Integer canteenId = (Integer) requestData.get("canteen_id");
        log.info("ids:"+ids);


        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效返回20002状态码
            return Result.loginFailure();
        }


        //登录有效
        //解析token封装到对象
        User user = jwtUtils.parseToken(token, User.class);

        //从对象中获取permission
        int permission = user.getPermission();

        //数据格式化处理
        String[] idArray;
        if (ids.contains("/")) {
            idArray = ids.split("/");
        } else {
            idArray = new String[]{ids};
        }
        log.info("格式化后的id数组："+idArray);



        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else if(permission==2){//超级管理员
            //执行批量删除操作
            Map<String, Object> deleteFoodResult = foodService.deleteFoodByIds(idArray);
            if(deleteFoodResult==null){
                return Result.fail("系统出错，删除失败~~~");
            }else{
                return Result.success(deleteFoodResult,"删除成功！");
            }
        }else if(permission==3){//第一饭堂一楼管理
            if(canteenId==1){//如果对于饭堂id，就执行
                //执行批量删除操作
                Map<String, Object> deleteFoodResult = foodService.deleteFoodByIds(idArray);
                if(deleteFoodResult==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(deleteFoodResult,"删除成功！");
                }
            }else{
                return Result.fail("第一饭堂一楼管理者无删除其它饭堂菜品的权限！");
            }

        }else if(permission==4){//第一饭堂三楼管理
            if(canteenId==2){//如果对应饭堂id，就执行
                //执行批量删除操作
                Map<String, Object> deleteFoodResult = foodService.deleteFoodByIds(idArray);
                if(deleteFoodResult==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(deleteFoodResult,"删除成功！");
                }
            }else{
                return Result.fail("第一饭堂三楼管理者无删除其它饭堂菜品的权限！");
            }

        }else if(permission==5){//第二饭堂管理

            if(canteenId==3){//如果对应饭堂id，就执行
                //执行批量删除操作
                Map<String, Object> deleteFoodResult = foodService.deleteFoodByIds(idArray);
                if(deleteFoodResult==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(deleteFoodResult,"删除成功！");
                }
            }else{
                return Result.fail("第二饭堂管理者无删除其它饭堂菜品的权限！");
            }

        }else if(permission==6){//第三饭堂管理

            if(canteenId==4){//如果对应饭堂id，就执行
                //执行批量删除操作
                Map<String, Object> deleteFoodResult = foodService.deleteFoodByIds(idArray);
                if(deleteFoodResult==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(deleteFoodResult,"删除成功！");
                }
            }else{
                return Result.fail("第三饭堂管理者无删除其它饭堂菜品的权限！");
            }

        }else{
            return Result.fail("系统出错，删除失败~~~");
        }

    }


    /**
     * 管理端——②菜品修改
     * @param requestData
     * @return
     */
    @ApiOperation("管理端——②菜品修改")
    @PostMapping("/modifyFood")
    public Result modifyFood(@RequestBody Map<String, Object> requestData) {

        String token = (String) requestData.get("token");
        Integer id = (Integer) requestData.get("id");
        String title = (String) requestData.get("title");
        String imageUrl = (String) requestData.get("imageUrl");

        BigDecimal price = new BigDecimal(requestData.get("price").toString());
        Integer foodClassId = (Integer) requestData.get("food_class_id");
        Integer canteenId = (Integer) requestData.get("canteen_id");
        String time = (String) requestData.get("time");
        String tags=(String) requestData.get("tags");


        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效返回20002状态码
            return Result.loginFailure();
        }


        //登录有效
        //解析token封装到对象
        User user = jwtUtils.parseToken(token, User.class);

        //从对象中获取permission
        int permission = user.getPermission();



        //封装:
        Food food = new Food();
        food.setId(id);
        food.setTitle(title);
        food.setImageUrl(imageUrl);
        food.setPrice(price);
        food.setFoodClassId(foodClassId);
        food.setCanteenId(canteenId);
        food.setTime(time);
        food.setTags(tags);
        food.setComment(5);//评分默认5

        // 在此处添加修改菜品信息的业务逻辑
        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else if(permission==2){//超级管理员
            Map<String, Object> modifyFood = foodService.modifyFood(food);
            if(modifyFood==null){
                return Result.fail("系统出错，修改失败~~~");
            }else{
                return Result.success("修改成功！");
            }
        }else if(permission==3){//第一饭堂一楼管理
            if(canteenId==1){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.modifyFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success("修改成功！");
                }
            }else{
                return Result.fail("第一饭堂一楼管理者无更改其它饭堂菜品的权限！");
            }

        }else if(permission==4){//第一饭堂三楼管理
            if(canteenId==2){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.modifyFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success("修改成功！");
                }
            }else{
                return Result.fail("第一饭堂三楼管理者无更改其它饭堂菜品的权限！");
            }

        }else if(permission==5){//第二饭堂管理

            if(canteenId==3){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.modifyFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success("修改成功！");
                }
            }else{
                return Result.fail("第二饭堂管理者无更改其它饭堂菜品的权限！");
            }

        }else if(permission==6){//第三饭堂管理

            if(canteenId==4){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.modifyFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success("修改成功！");
                }
            }else{
                return Result.fail("第三饭堂管理者无更改其它饭堂菜品的权限！");
            }

        }else{
            return Result.fail("系统出错，修改失败~~~");
        }

    }



    /**
     * 管理端——②新增菜品
     * @param requestData
     * @return
     */
    @ApiOperation("管理端——③新增菜品")
    @PostMapping("/addFood")
    public Result addFood(@RequestBody Map<String, Object> requestData) {

        String token = (String) requestData.get("token");
        //Integer id = (Integer) requestData.get("id");//菜品插入不用id的，因为是自增
        String title = (String) requestData.get("title");
        String imageUrl = (String) requestData.get("imageUrl");

        BigDecimal price = new BigDecimal(requestData.get("price").toString());
        Integer foodClassId = (Integer) requestData.get("food_class_id");
        Integer canteenId = (Integer) requestData.get("canteen_id");
        String time = (String) requestData.get("time");
        String tags=(String) requestData.get("tags");



        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效返回20002状态码
            return Result.loginFailure();
        }
        //登录有效
        //解析token封装到对象
        User user = jwtUtils.parseToken(token, User.class);

        //从对象中获取permission
        int permission = user.getPermission();


        //封装:
        Food food = new Food();
        //food.setId(id);
        food.setTitle(title);
        food.setImageUrl(imageUrl);
        food.setPrice(price);
        food.setFoodClassId(foodClassId);
        food.setCanteenId(canteenId);
        food.setTime(time);
        food.setTags(tags);
        food.setComment(5);//评分默认5

        // 在此处添加修改菜品信息的业务逻辑
        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else if(permission==2){//超级管理员
            Map<String, Object> modifyFood = foodService.addFood(food);
            if(modifyFood==null){
                return Result.fail("系统出错，新增失败~~~");
            }else{
                return Result.success("新增成功！");
            }
        }else if(permission==3){//第一饭堂一楼管理
            if(canteenId==1){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.addFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success("新增成功！");
                }
            }else{
                return Result.fail("第一饭堂一楼管理者无新增其它饭堂菜品的权限！");
            }

        }else if(permission==4){//第一饭堂三楼管理
            if(canteenId==2){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.addFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success("新增成功！");
                }
            }else{
                return Result.fail("第一饭堂三楼管理者无新增其它饭堂菜品的权限！");
            }

        }else if(permission==5){//第二饭堂管理

            if(canteenId==3){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.addFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success("新增成功！");
                }
            }else{
                return Result.fail("第二饭堂管理者无新增其它饭堂菜品的权限！");
            }

        }else if(permission==6){//第三饭堂管理

            if(canteenId==4){//如果对于饭堂id，就执行
                Map<String, Object> modifyFood = foodService.addFood(food);
                if(modifyFood==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success("新增成功！");
                }
            }else{
                return Result.fail("第三饭堂管理者无新增其它饭堂菜品的权限！");
            }

        }else{
            return Result.fail("系统出错，新增失败~~~");
        }

    }


}

